\chapter{排版数学公式}\label{chap:math}
\addtocontents{los}{\protect\addvspace{10pt}}

\begin{intro}
准备好了！本章将见识到 \LaTeX{} 闻名的强项——排版数学公式。当然你得注意了，本章的内容只是一点皮毛，
虽然对大多数人来说已经够用了，但是如果不能解决你的问题的话也不要大惊小怪，求助于搜索引擎或者有经验的人不失为一个好办法。
\end{intro}
\DeclareRobustCommand*\amscmd[1]{\textcolor{blue}{\cmd{#1}}}
\DeclareRobustCommand*\amsenv[1]{\textcolor{blue}{\env{#1}}}

\section{\hologo{AmS} 宏集}\label{sec:ams-bundle}

\pkgindex{amsmath,amsfonts,amssymb,amsthm}
在介绍数学公式排版之前，简单介绍一下 \hologo{AmS} 宏集。\hologo{AmS} 宏集合是美国数学学会(American Mathematical Society)提供的对
\LaTeX{} 原生的数学公式排版的扩展，其核心是 \pkg{amsmath} 宏包，对多行公式的排版提供了有力的支持。
此外，\pkg{amsfonts} 宏包以及基于它的 \pkg{amssymb} 宏包提供了丰富的数学符号；\pkg{amsthm} 宏包扩展了 \LaTeX{} 定理证明格式。

本章介绍的许多命令和环境依赖于 \pkg{amsmath} 宏包，这些命令和环境将以\textcolor{blue}{蓝色}示意。以下示例都假定了导言区中写有
\begin{verbatim}
\usepackage{amsmath}
\end{verbatim}

\section{公式排版基础}\label{sec:math-basics}

\subsection{行内和行间公式}\label{subsec:math-inline-display}

数学公式有两种排版方式：其一是与文字混排，称为\textbf{行内公式}；其二是单独列为一行排版，称为\textbf{行间公式}。

\pinyinindex{hangneigongshi}{行内公式}
\index{^^d@\texttt\$ (\textit{数学模式})}
行内公式由一对 \texttt\$ 符号包裹：
\begin{example}
The Pythagorean theorem is
$a^2 + b^2 = c^2$.
\end{example}

\envindex{equation}
\cmdindex{label,ref,nonumber}
\cmdindex[amsmath]{eqref,tag,notag}
单独成行的\textbf{行间公式}在 \LaTeX{} 里由 \env{equation} 环境包裹。
\env{equation} 环境为公式自动生成一个编号，这个编号可以用 \cmd{label} 和 \cmd{ref} 生成交叉引用，
\pkg{amsmath} 的 \amscmd{eqref} 命令甚至为引用自动加上圆括号；还可以用 \amscmd{tag} 命令手动修改公式的编号，
或者用 \amscmd{notag} 命令取消为公式编号（与之基本等效的命令是 \cmd{nonumber}）。

\begin{example}
The Pythagorean theorem is:
\begin{equation}
a^2 + b^2 = c^2 \label{pythagorean}
\end{equation}
Equation \eqref{pythagorean} is
called `Gougu theorem' in Chinese.
\end{example}

\begin{example}
It's wrong to say
\begin{equation}
1 + 1 = 3 \tag{dumb}
\end{equation}
or
\begin{equation}
1 + 1 = 4 \notag
\end{equation}
\end{example}

\cmdindex{[,]}
\envindex{displaymath}
\envindex[amsmath]{equation*}
如果需要直接使用不带编号的行间公式，则将公式用命令 \cmd{[} 和 \cmd{]} 包裹%
\footnote{\TeX{} 原生排版行间公式的方法是用一对 \texttt{\$\$} 符号包裹，不过无法通过指定 \texttt{fleqn} 选项控制左对齐，
与上下文之间的间距也不好调整，故不太推荐使用。}，
与之等效的是 \env{displaymath} 环境。有的人更喜欢 \amsenv{equation*} 环境，体现了带星号和不带星号的环境之间的区别。

\begin{example}
\begin{equation*}
a^2 + b^2 = c^2
\end{equation*}
For short:
\[ a^2 + b^2 = c^2 \]
Or if you like the long one:
\begin{displaymath}
a^2 + b^2 = c^2
\end{displaymath}
\end{example}

我们通过一个例子展示行内公式和行间公式的对比。为了与文字相适应，行内公式在排版大的公式元素（分式、巨算符等）时显得很“局促”：

\begin{example}
In text:
$\lim_{n \to \infty}
\sum_{k=1}^n \frac{1}{k^2}
= \frac{\pi^2}{6}$.

In display:
\[
\lim_{n \to \infty}
\sum_{k=1}^n \frac{1}{k^2}
= \frac{\pi^2}{6}
\]
\end{example}

行间公式的对齐、编号位置等性质由文档类选项控制，文档类的 \texttt{fleqn} 选项令行间公式左对齐；
\texttt{leqno} 选项令编号放在公式左边。

\subsection{数学模式}\label{subsec:math-mode}

\pinyinindex{shuxuemoshi}{数学模式}
\cmdindex[amsmath]{text}
当用户使用 \texttt\$ 开启行内公式输入，或是使用 \cmd{[} 命令、\env{equation} 环境时，\LaTeX{} 就进入了\textbf{数学模式}。
数学模式相比于文本模式有以下特点：
\begin{enumerate}
  \item 数学模式中输入的空格被忽略。数学符号的间距默认由符号的性质（关系符号、运算符等）决定。
  需要人为引入间距时，使用 \cmd{quad} 和 \cmd{qquad} 等命令。详见 \ref{sec:math-space} 节。
  \item \textbf{不允许有空行（分段）}。行间公式中也无法用 \crcmd{} 命令手动换行。排版多行公式需要用到
  \ref{sec:multi-eqns} 节介绍的各种环境。
  \item 所有的字母被当作数学公式中的变量处理，字母间距与文本模式不一致，也无法生成单词之间的空格。
  如果想在数学公式中输入正体的文本，简单情况下可用 \ref{subsec:math-alpha} 小节中提供的 \cmd{mathrm} 命令。
  或者用 \pkg{amsmath} 提供的 \amscmd{text} 命令%
  \footnote{\amscmd{text} 命令仅适合在公式中穿插少量文字。如果你的情况正好相反，需要在许多文字中穿插使用公式，
  则应该像正常的行内公式那样用，而不是滥用 \amscmd{text} 命令。}。
\end{enumerate}
\begin{example}
% \usepackage{amssymb}
$x^{2} \geq 0 \qquad
\text{for \textbf{all} }
x\in\mathbb{R}$
\end{example}

\section{数学符号}\label{sec:math-symbols}

\def\msym#1{$\csname #1\endcsname$ (\cmd{#1})}

\pkgindex{amssymb}
本节我们将接触到形形色色的数学符号，它们是 \LaTeX{} 卓越的数学公式排版能力的基础。\LaTeX{} 默认提供了常用的数学符号，
\pkg{amssymb} 宏包提供了一些次常用的符号。大多数常用的数学符号都能在本章末尾的 \ref{sec:math-tables} 节列出的各个表格里查到。
更多符号可查阅参考文献\cite{symbols}。

\subsection{一般符号}\label{subsec:math-general}

\pinyinindex{xilazimu}{希腊字母 (数学符号)}
\msymindex{infty}
希腊字母符号的名称就是其英文名称，如 \msym{alpha}、\msym{beta} 等等。
大写的希腊字母为首字母大写的命令，如 \msym{Gamma}、\msym{Delta} 等等。
无穷大符号为 \msym{infty}。更多符号命令可参考表 \ref{tbl:math-greek} 和 \ref{tbl:math-misc} 等。

\msymindex{dots,ldots,cdots}
省略号有 \msym{dots} 和 \msym{cdots} 两种形式。它们有各自合适的用途：
\begin{example}
$a_1, a_2, \dots, a_n$ \\
$a_1 + a_2 + \cdots + a_n$
\end{example}

\cmd{ldots} 和 \cmd{dots} 是完全等效的，它们既能用在公式中，也用来在文本里作为省略号（详见 \ref{subsec:punct} 小节）。
除此之外，在矩阵中可能会用到竖排的 \msym{vdots} 和斜排的 \msym{ddots}。

\subsection{指数、上下标和导数}\label{subsec:math-scripts}

\index{^@\texttt\textasciicircum\ (\textit{数学上标})}
\index{_@\texttt\textunderscore\ (\textit{数学下标})}
在 \LaTeX{} 中用 \texttt\textasciicircum 和 \texttt\textunderscore 标明上下标。
注意上下标的内容（子公式）一般需要\textbf{用花括号包裹}，否则上下标只对后面的一个符号起作用。
\begin{example}
$p^3_{ij} \qquad
m_\mathrm{Knuth}\qquad
\sum_{k=1}^3 k $\\[5pt]
$a^x+y \neq a^{x+y}\qquad
e^{x^2} \neq {e^x}^2$
\end{example}

\pinyinindex{daoshu}{导数符号\texttt' ($a'$)}
导数符号\texttt'(${}'$)是一类特殊的上标，可以适当连用表示多阶导数，也可以在其后连用上标：
\begin{example}
$f(x) = x^2 \quad f'(x)
= 2x \quad f''^{2}(x) = 4$
\end{example}

\subsection{分式和根式}\label{subsec:frac-sqrt}

\mathindex{frac}
\cmdindex[amsmath]{dfrac,tfrac}
分式使用 \cmd{frac}\marg*{分子}\marg*{分母} 来书写。分式的大小在行间公式中是正常大小，而在行内被极度压缩。
\pkg{amsmath} 提供了方便的命令 \amscmd{dfrac} 和 \amscmd{tfrac}，令用户能够在行内使用正常大小的分式，或是反过来。
\begin{example}
In display style:
\[
3/8 \qquad \frac{3}{8}
\qquad \tfrac{3}{8}
\]
In text style:
$1\frac{1}{2}$~hours \qquad
$1\dfrac{1}{2}$~hours
\end{example}

\mathindex{sqrt}
一般的根式使用 \cmd{sqrt}\marg*{...}；表示 $n$ 次方根时写成 \cmd{sqrt}\oarg*{\textit{n}}\marg*{...}。
\begin{example}
$\sqrt{x} \Leftrightarrow x^{1/2}
\quad \sqrt[3]{2}
\quad \sqrt{x^{2} + \sqrt{y}}$
\end{example}

\cmdindex[amsmath]{binom}
特殊的分式形式，如二项式结构，由 \pkg{amsmath} 宏包的 \amscmd{binom} 命令生成：
\begin{example}
Pascal's rule is
\[
\binom{n}{k} =\binom{n-1}{k}
+ \binom{n-1}{k-1}
\]
\end{example}

\subsection{关系符}\label{subsec:math-rel}

\msymindex{ne,ge,le,approx,equiv,propto,sim}
\LaTeX{} 常见的关系符号除了可以直接输入的 $=$，$>$，$<$，其它符号用命令输入，常用的有不等号 \msym{ne}、
大于等于号 \msym{ge} 和小于等于号 \msym{le}%
\footnote{倾斜的关系符号 \msym{leqslant} 和 \msym{geqslant} 由 \pkg{amssymb} 提供，见表 \ref{tbl:ams-rel}。}、
约等号 \msym{approx}、等价 \msym{equiv}、正比 \msym{propto}、相似 \msym{sim} 等等。
更多符号命令可参考表 \ref{tbl:math-rel} 以及表 \ref{tbl:ams-rel}。

\mathindex{stackrel}
\LaTeX{} 还提供了自定义二元关系符的命令 \cmd{stackrel}，用于将一个符号叠加在原有的二元关系符之上：
\begin{example}
\[
f_n(x) \stackrel{*}{\approx} 1
\]
\end{example}

\subsection{算符}\label{subsec:math-op}

\msymindex{times,div,cdot,pm,mp}
\LaTeX{} 中的算符大多数是二元算符，除了直接用键盘可以输入的 $+$、$-$、$*$、$/$，其它符号用命令输入，
常用的有乘号 \msym{times}、 除号 \msym{div}、点乘 \msym{cdot}、加减号 \msym{pm} / \msym{mp} 等等。
更多符号命令可参考表 \ref{tbl:math-op} 以及表 \ref{tbl:ams-op}。

\msymindex{nabla,partial}
\msym{nabla} 和 \msym{partial} 也是常用的算符，虽然它们不属于二元算符。

\pinyinindex{shuxuehanshu}{数学函数}
\LaTeX{} 将数学函数的名称作为一个算符排版，字体为直立字体。其中有一部分符号在上下位置可以书写一些内容作为条件，
类似于后文所叙述的巨算符。

\begin{table}[htp]
\centering
\caption{\LaTeX{} 作为算符的函数名称一览}\label{tbl:math-functions}
\begin{tabular}{*{5}{p{5em}}}
\hline
\multicolumn{5}{c}{\textbf{不带上下限的算符}} \\
\hline
\cmd{sin} & \cmd{arcsin} & \cmd{sinh} & \cmd{exp} & \cmd{dim} \\
\cmd{cos} & \cmd{arccos} & \cmd{cosh} & \cmd{log} & \cmd{ker} \\
\cmd{tan} & \cmd{arctan} & \cmd{tanh} & \cmd{lg}  & \cmd{hom} \\
\cmd{cot} & \cmd{arg}    & \cmd{coth} & \cmd{ln}  & \cmd{deg} \\
\cmd{sec} & \cmd{csc}    & \\
\hline
\multicolumn{5}{c}{\textbf{带上下限的算符}} \\
\hline
\cmd{lim} & \cmd{limsup} & \cmd{liminf} & \cmd{sup} & \cmd{inf} \\
\cmd{min} & \cmd{max}    & \cmd{det}    & \cmd{Pr}  & \cmd{gcd} \\
\hline
\end{tabular}
\end{table}

\begin{example}
\[
  \lim_{x \rightarrow 0}
  \frac{\sin x}{x}=1
\]
\end{example}

\mathindex{bmod,pmod}
对于求模表达式，\LaTeX{} 提供了 \cmd{bmod} 和 \cmd{pmod} 命令，前者相当于一个二元运算符，后者作为同余表达式的后缀：
\begin{example}
$a\bmod b \\
 x\equiv a \pmod{b}$
\end{example}

\cmdindex[amsmath]{DeclareMathOperator}
如果表 \ref{tbl:math-functions} 中的算符不够用的话，\pkg{amsmath} 允许用户在导言区用 \amscmd{Declare\-Math\-Operator}
定义自己的算符，其中带星号的命令定义带上下限的算符：
\begin{verbatim}
\DeclareMathOperator{\argh}{argh}
\DeclareMathOperator*{\nut}{Nut}
\end{verbatim}

\begin{example}
\[\argh 3 = \nut_{x=1} 4x\]
\end{example}

\subsection{巨算符}\label{subsec:math-bigop}

\msymindex{int,oint,sum,prod}
积分号 \msym{int}、求和号 \msym{sum} 等符号称为\textbf{巨算符}。巨算符在行内公式和行间公式的大小和形状有区别。
\begin{example}
In text:
$\sum_{i=1}^n \quad
\int_0^{\frac{\pi}{2}} \quad
\oint_0^{\frac{\pi}{2}} \quad
\prod_\epsilon $ \\
In display:
\[\sum_{i=1}^n \quad
\int_0^{\frac{\pi}{2}} \quad
\oint_0^{\frac{\pi}{2}} \quad
\prod_\epsilon \]
\end{example}

\mathindex{limits,nolimits}
巨算符的上下标位置可由 \cmd{limits} 和 \cmd{nolimits} 调整，前者令巨算符类似 $\lim$ 或求和算符 $\sum$，上下标位于上下方；
后者令巨算符类似积分号，上下标位于右上方和右下方。
\begin{example}
In text:
$\sum\limits_{i=1}^n \quad
\int\limits_0^{\frac{\pi}{2}} \quad
\prod\limits_\epsilon $ \\
In display:
\[\sum\nolimits_{i=1}^n \quad
\int\limits_0^{\frac{\pi}{2}} \quad
\prod\nolimits_\epsilon \]
\end{example}

\cmdindex[amsmath]{substack}
\envindex[amsmath]{subarray}
\pkg{amsmath} 宏包还提供了 \amscmd{substack}，能够在下限位置书写多行表达式；\amsenv{subarray}
环境更进一步，令多行表达式可选择居中 (c) 或左对齐 (l)：
\begin{example}
% \usepackage{amssymb}
\[
\sum_{\substack{0\le i\le n \\
  j\in \mathbb{R}}}
P(i,j) = Q(n)
\]
\[
\sum_{\begin{subarray}{l}
  0\le i\le n \\
  j\in \mathbb{R}
\end{subarray}}
P(i,j) = Q(n)
\]
\end{example}

\subsection{数学重音和上下括号}\label{subsec:math-accents}

\maccindex{dot,ddot,vec,hat}
数学符号可以像文字一样加重音，比如求导符号 $\dot{r}$ (\cmd{dot}\marg*{r})、 $\ddot{r}$ (\cmd{ddot}\marg*{r})、
表示向量的箭头 $\vec{r}$ (\cmd{vec}\marg*{r}) 、表示单位向量的符号 $\hat{\mathbf{e}}$ (\cmd{hat}\marg*{\cmd{mathbf}\marg*{e}}) 等，
详见表 \ref{tbl:math-accents}。使用时要注意重音符号的作用区域，一般应当对某个符号而不是“符号加下标”使用重音：
\begin{example}
$\bar{x_0} \quad \bar{x}_0$\\[5pt]
$\vec{x_0} \quad \vec{x}_0$\\[5pt]
$\hat{\mathbf{e}_x} \quad
 \hat{\mathbf{e}}_x$
\end{example}

\waccindex{overline,underline}
\waccindex{widehat,overrightarrow}
\LaTeX{} 也能为多个字符加重音，包括直接画线的 \cmd{overline} 和 \cmd{underline} 命令（可叠加使用）、宽重音符号 \cmd{widehat}、
表示向量的箭头 \cmd{overrightarrow} 等。后两者详见表 \ref{tbl:math-accents} 和 \ref{tbl:math-arrow-accents} 等。
\begin{example}
$0.\overline{3} =
\underline{\underline{1/3}}$ \\[5pt]
$\hat{XY} \qquad \widehat{XY}$\\[5pt]
$\vec{AB} \qquad
\overrightarrow{AB}$
\end{example}

\waccindex{overbrace,underbrace}
\cmd{overbrace} 和 \cmd{underbrace} 命令用来生成上/下括号，各自可带一个上/下标公式。
\begin{example}
$\underbrace{\overbrace{(a+b+c)}^6
\cdot \overbrace{(d+e+f)}^7}
_\text{meaning of life} = 42$
\end{example}

\subsection{箭头}\label{subsec:math-arrows}

\msymindex{to,rightarrow,leftarrow,uparrow,downarrow}
常用的箭头包括 \cmd{rightarrow} ($\rightarrow$，或 \cmd{to})、\cmd{leftarrow}（$\leftarrow$，或 \cmd{gets}）等。
更多箭头详见表 \ref{tbl:math-arrows}。

\cmdindex[amsmath]{xleftarrow,xrightarrow}
\pkg{amsmath} 的 \amscmd{xleft\-arrow} 和 \amscmd{xright\-arrow} 命令提供了长度可以伸展的箭头，并且可以为箭头增加上下标：
\begin{example}
\[ a\xleftarrow{x+y+z} b \]
\[ c\xrightarrow[x<y]{a*b*c}d \]
\end{example}

\subsection{括号和定界符}\label{subsec:math-delims}

\LaTeX{} 提供了多种括号和定界符表示公式块的边界，如小括号 $()$、中括号 $[]$、
大括号 $\{\}$（\cmd{\{} \cmd{\}}）、尖括号 $\langle \rangle$（\cmd{langle} \cmd{rangle}）等。
更多的括号/定界符命令见表 \ref{tbl:math-delims} 和 \ref{tbl:math-large-delims}。
\begin{example}
${a,b,c} \neq \{a,b,c\}$
\end{example}

\mathindex{left,right}
\mathindex{right}
使用 \cmd{left} 和 \cmd{right} 命令可令括号（定界符）的大小可变，在行间公式中常用。\LaTeX{} 会自动根据括号内的公式大小决定定界符大小。
\cmd{left} 和 \cmd{right} 必须成对使用。需要使用单个定界符时，另一个定界符写成 \cmd{left.} 或 \cmd{right.}。
\begin{example}
\[1 + \left(\frac{1}{1-x^{2}}
\right)^3 \qquad
\left.\frac{\partial f}{\partial t}
\right|_{t=0}\]
\end{example}

\mathindex{big,bigg,Big,Bigg}
\mathindex{bigl,biggl,Bigl,Biggl}
\mathindex{bigr,biggr,Bigr,Biggr}
有时我们不满意于 \LaTeX{} 为我们自动调节的定界符大小。这时我们还可以用 \cmd{big}、\cmd{bigg} 等命令生成固定大小的定界符。
更常用的形式是类似 \cmd{left} 的 \cmd{bigl}、\cmd{biggl} 等，以及类似 \cmd{right} 的 \cmd{bigr}、\cmd{biggr} 等
（\cmd{bigl} 和 \cmd{bigr} 不必成对出现）。
\begin{example}
$\Bigl((x+1)(x-1)\Bigr)^{2}$\\
$\bigl( \Bigl( \biggl( \Biggl( \quad
\bigr\} \Bigr\} \biggr\} \Biggr\} \quad
\big\| \Big\| \bigg\| \Bigg\| \quad
\big\Downarrow \Big\Downarrow
\bigg\Downarrow \Bigg\Downarrow$
\end{example}

使用 \cmd{big} 和 \cmd{bigg} 等命令的另外一个好处是：用 \cmd{left} 和 \cmd{right} 分界符包裹的公式块是不允许断行的
（下文提到的 \env{array} 或者 \amsenv{aligned} 等环境视为一个公式块），所以也不允许在多行公式里跨行使用，
而 \cmd{big} 和 \cmd{bigg} 等命令不受限制。

\section{多行公式}\label{sec:multi-eqns}

\subsection{长公式折行}\label{subsec:multline}

通常来讲应当避免写出超过一行而需要折行的长公式。如果一定要折行的话，习惯上优先在等号之前折行，其次在加号、减号之前，再次在乘号、除号之前。
其它位置应当避免折行。

\envindex[amsmath]{multline}
\pkg{amsmath} 宏包的 \amsenv{multline} 环境提供了书写折行长公式的方便环境。
它允许用 \crcmd{} 折行，将公式编号放在最后一行。
多行公式的首行左对齐，末行右对齐，其余行居中。
\begin{example}
\begin{multline}
a + b + c + d + e + f
+ g + h + i \\
= j + k + l + m + n\\
= o + p + q + r + s\\
= t + u + v + x + z
\end{multline}
\end{example}

与表格不同的是，公式的最后一行不写 \crcmd，如果写了，反倒会产生一个多余的空行。

\envindex[amsmath]{multline*}
类似 \amsenv{equation*}，\amsenv{multline*} 环境排版不带编号的折行长公式。

\subsection{多行公式}\label{subsec:align}

\pinyinindex{duohanggongshi}{多行公式|(}
更多的情况是，我们需要罗列一系列公式，并令其按照等号对齐。

读者可能阅读过其它手册或者资料，知道 \LaTeX{} 提供了 \env{eqnarray} 环境。它按照等号左边——等号——等号右边呈三列对齐，
但等号周围的空隙过大，加上公式编号等一些 bug，目前已不推荐使用\footnote{\url{http://tug.org/pracjourn/2006-4/madsen/madsen.pdf}}。

\envindex[amsmath]{align}
\index{&@\texttt\& (\textit{单元格/对齐})}
目前最常用的是 \amsenv{align} 环境，它将公式用 \texttt\& 隔为两部分并对齐。分隔符通常放在等号左边：
\begin{example}
\begin{align}
a & = b + c \\
& = d + e
\end{align}
\end{example}

\cmdindex[amsmath]{notag}
\amsenv{align} 环境会给每行公式都编号。我们仍然可以用 \amscmd{notag} 去掉某行的编号。
在以下的例子，为了对齐等号，我们将分隔符放在右侧，并且此时需要在等号后添加一对括号 \texttt\{\texttt\} 以产生正常的间距：
\begin{example}
\begin{align}
a ={} & b + c \\
  ={} & d + e + f + g + h + i
        + j + k + l \notag \\
      & + m + n + o \\
  ={} & p + q + r + s
\end{align}
\end{example}

\amsenv{align} 还能够对齐多组公式，除等号前的 \texttt\& 之外，公式之间也用 \texttt\& 分隔：
\begin{example}
\begin{align}
a &=1  &  b &=2   & c &=3   \\
d &=-1 &  e &=-2  & f &=-5
\end{align}
\end{example}

\envindex[amsmath]{gather}
如果我们不需要按等号对齐，只需罗列数个公式，\amsenv{gather} 将是一个很好用的环境：
\begin{example}
\begin{gather}
a = b + c \\
d = e + f + g \\
h + i = j + k \notag \\
l + m = n
\end{gather}
\end{example}

\envindex[amsmath]{align*,gather*}
\amsenv{align} 和 \amsenv{gather} 有对应的不带编号的版本 \amsenv{align*} 和 \amsenv{gather*}。

\subsection{公用编号的多行公式}\label{subsec:aligned}

\envindex[amsmath]{aligned,gathered}
另一个常见的需求是将多个公式组在一起公用一个编号，编号位于公式的居中位置。为此，\pkg{amsmath} 宏包
提供了诸如 \amsenv{aligned}、\amsenv{gathered} 等环境，与 \env{equation} 环境套用。
以 \texttt{-ed} 结尾的环境用法与前一节不以 \texttt{-ed} 结尾的环境用法一一对应。我们仅以 \amsenv{aligned} 举例：
\begin{example}
\begin{equation}
\begin{aligned}
a &= b + c \\
d &= e + f + g \\
h + i &= j + k \\
l + m &= n
\end{aligned}
\end{equation}
\end{example}

\envindex[amsmath]{split}
\amsenv{split} 环境和 \amsenv{aligned} 环境用法类似，也用于和 \env{equation} 环境套用，
区别是 \amsenv{split} 只能将每行的一个公式分两栏，\amsenv{aligned} 允许每行多个公式多栏。

\pinyinindex{duohanggongshi}{多行公式|)}

\section{数组和矩阵}\label{sec:arrays}

\envindex{array}
\index{&@\texttt\& (\textit{单元格/对齐})}
为了排版二维数组，\LaTeX{} 提供了 \env{array} 环境，用法与 \env{tabular} 环境极为类似，也需要定义列格式，并用 \crcmd{} 换行。
数组可作为一个公式块，在外套用 \cmd{left}、\cmd{right} 等定界符：
\begin{example}
\[ \mathbf{X} = \left(
\begin{array}{cccc}
x_{11} & x_{12} & \ldots & x_{1n}\\
x_{21} & x_{22} & \ldots & x_{2n}\\
\vdots & \vdots & \ddots & \vdots\\
x_{n1} & x_{n2} & \ldots & x_{nn}\\
\end{array} \right) \]
\end{example}

值得注意的是，上一节末尾介绍的 \amsenv{aligned} 等环境也可以用定界符包裹。

\mathindex{left}
\mathindex{right}
我们还可以利用空的定界符排版出这样的效果：
\begin{example}
\[ |x| = \left\{
\begin{array}{rl}
-x & \text{if } x < 0,\\
0 & \text{if } x = 0,\\
x & \text{if } x > 0.
\end{array} \right. \]
\end{example}

\envindex[amsmath]{cases}
不过上述例子可以用 \pkg{amsmath} 提供的 \amsenv{cases} 环境更轻松地完成：
\begin{example}
\[ |x| =
\begin{cases}
-x & \text{if } x < 0,\\
0 & \text{if } x = 0,\\
x & \text{if } x > 0.
\end{cases} \]
\end{example}

\envindex[amsmath]{matrix,pmatrix,bmatrix,Bmatrix,vmatrix,Vmatrix}
我们当然也可以用 \env{array} 环境排版各种矩阵。\pkg{amsmath} 宏包还直接提供了多种排版矩阵的环境，包括不带定界符的 \amsenv{matrix}，
以及带各种定界符的矩阵 \amsenv{pmatrix}（$\bigl($）、\amsenv{bmatrix}（$\bigl[$）、\amsenv{Bmatrix}（$\bigl\{$）、
\amsenv{vmatrix}（$\bigl\vert$）、\amsenv{Vmatrix}（$\bigl\Vert$）。使用这些环境时，无需给定列格式%
\footnote{事实上这些矩阵内部也是用 \env{array} 环境生成的，列格式默认为 \texttt{*\{\Arg{n}\}\{c\}}，\Arg{n} 默认为 10；
\amsenv{cases} 内部是一个列格式为 \texttt{@\{\}l@\{\cmd{quad}\}l@\{\}} 的 \env{array} 环境。}：
\begin{example}
\[
\begin{matrix}
1 & 2 \\ 3 & 4
\end{matrix} \qquad
\begin{bmatrix}
x_{11} & x_{12} & \ldots & x_{1n}\\
x_{21} & x_{22} & \ldots & x_{2n}\\
\vdots & \vdots & \ddots & \vdots\\
x_{n1} & x_{n2} & \ldots & x_{nn}\\
\end{bmatrix}
\]
\end{example}

在矩阵中的元素里排版分式时，一来要用到 \amscmd{dfrac} 等命令，二来行与行之间有可能紧贴着，这时要用到
\ref{subsec:tabular-colht} 小节的方法来调节间距：
\begin{example}
\[
\mathbf{H}=
\begin{bmatrix}
\dfrac{\partial^2 f}{\partial x^2} &
\dfrac{\partial^2 f}
      {\partial x \partial y} \\[8pt]
\dfrac{\partial^2 f}
      {\partial x \partial y} &
\dfrac{\partial^2 f}{\partial y^2}
\end{bmatrix}
\]
\end{example}

\section{公式中的间距}\label{sec:math-space}

\cmdindex{quad,qquad}
\index{,@\cmd{,}} % The only one which cannot use \cmdindex, oops..
\mathindex{:,;,"!}
前文提到过，绝大部分时候，数学公式中各元素的间距是根据符号类型自动生成的，需要我们手动调整的情况极少。
我们已经认识了两个生成间距的命令 \cmd{quad} 和 \cmd{qquad}。在公式中我们还可能用到的间距包括 \cmd{,}、\cmd{:}、\cmd{;}
以及负间距 \cmd{!}，其中 \cmd{quad} 、 \cmd{qquad} 和 \cmd{,} 在文本和数学环境中可用，后三个命令只用于数学环境。
文本中的 \cmd{\textvisiblespace} 也能使用在数学公式中。

\newdimen\testdimen \testdimen=\fontdimen6\textfont2 \divide\testdimen18\relax
\begin{center}
\begin{tabularx}{0.9\textwidth}{*{3}{>{\raggedright\arraybackslash}X}|*{3}{>{\raggedright\arraybackslash}X}}
 \hline
 无额外间距  &                          & $a a$        &
 \cmd{,}     & \demowidth{3\testdimen}  & $a\,a$       \\
 \cmd{quad}  & \demowidth{18\testdimen} & $a\quad a$   &
 \cmd{:}     & \demowidth{4\testdimen}  & $a\:a$       \\
 \cmd{qquad} & \demowidth{36\testdimen} & $a\qquad a$  &
 \cmd{;}     & \demowidth{5\testdimen}  & $a\;a$       \\
 \cmd{\textvisiblespace}     & \demowidth{\fontdimen2\textfont0} & $a\ a$ &
 \cmd{!}     & $-$\demowidth{3\testdimen} & $a\!a$     \\
 \hline
\end{tabularx}
\end{center}

一个常见的用途是修正积分的被积函数 $f(x)$ 和微元 $\mathrm{d}x$ 之间的距离。
注意微元里的 $\mathrm{d}$ 用的是直立体：
\begin{example}
\[
\int_a^b f(x)\mathrm{d}x
\qquad
\int_a^b f(x)\,\mathrm{d}x
\]
\end{example}

另一个用途是生成多重积分号。如果我们直接连写两个 \cmd{int}，之间的间距将会过宽，此时可以使用负间距
\cmd{!} 修正之。不过 \pkg{amsmath} 提供了更方便的多重积分号，如二重积分 \amscmd{iint}、三重积分
\amscmd{iiint} 等。
\begin{example}
\newcommand\diff{\,\mathrm{d}}
\begin{gather*}
\int\int f(x)g(y)
\diff x \diff y \\
\int\!\!\!\int
f(x)g(y) \diff x \diff y \\
\iint f(x)g(y) \diff x \diff y \\
\iint\quad \iiint\quad \idotsint
\end{gather*}
\end{example}

\section{数学符号的字体控制}\label{sec:math-fonts}

\subsection{数学字母字体}\label{subsec:math-alpha}

\mathindex{mathrm,mathsf,mathtt,mathit,mathbf,mathcal,mathnormal}
\cmdindex[amssymb]{mathbb,mathfrak}
\cmdindex[mathrsfs]{mathscr}
\LaTeX{} 允许一部分数学符号切换字体，主要是拉丁字母、数字、大写希腊字母以及重音符号等。
表 \ref{tbl:math-fonts} 给出了切换字体的命令。某一些命令需要字体宏包的支持。
\begin{example}
% \usepackage{amssymb}
$\mathcal{R} \quad \mathfrak{R}
\quad \mathbb{R}$
\[\mathcal{L}
= -\frac{1}{4}F_{\mu\nu}F^{\mu\nu}\]
$\mathfrak{su}(2)$ and
$\mathfrak{so}(3)$ Lie algebra
\end{example}

\begin{table}[htp]
\centering
\caption{数学字母字体} \label{tbl:math-fonts}
\begin{tabular}{*{3}{l}}
\hline
\textbf{示例}    & \textbf{命令} & \textbf{依赖的宏包}\\
\hline
$\mathnormal{ABCDE abcde 1234}$  & \cmd{mathnormal}\marg*{\ldots}&       \\
$\mathrm{ABCDE abcde 1234}$      & \cmd{mathrm}\marg*{\ldots}    &       \\
$\mathit{ABCDE abcde 1234}$      & \cmd{mathit}\marg*{\ldots}    &       \\
$\mathbf{ABCDE abcde 1234}$      & \cmd{mathbf}\marg*{\ldots}    &       \\
$\mathsf{ABCDE abcde 1234}$      & \cmd{mathsf}\marg*{\ldots}    &       \\
$\mathtt{ABCDE abcde 1234}$      & \cmd{mathtt}\marg*{\ldots}    &       \\
$\CMcal{ABCDE}$                  & \cmd{mathcal}\marg*{\ldots}   & 仅提供大写字母 \\
\hline
$\EuScript{ABCDE}$               & \cmd{mathcal}\marg*{\ldots}   & \pkg{eucal} 仅提供大写字母 \\
$\mathscr{ABCDE}$                & \cmd{mathscr}\marg*{\ldots}   & \pkg{mathrsfs} 仅提供大写字母\\
$\mathfrak{ABCDE abcde 1234}$    & \cmd{mathfrak}\marg*{\ldots}  & \pkg{amssymb} 或 \pkg{eufrak}  \\
$\mathbb{ABCDE}$                 & \cmd{mathbb}\marg*{\ldots}    & \pkg{amssymb} 仅提供大写字母 \\
\hline
\end{tabular}
\end{table}

一般来说，不同的数学字体往往带有不同的语义，如矩阵、向量等常会使用粗体或粗斜体，而数集常会使用 \cmd{mathbb} 表示。出于内容与格式分离以及方便书写的考虑，可以为它们定义新的命令。具体方法详见 \ref{subsec:newcmd} 小节。

\pkgindex{unicode-math}
如果需要为所有的数学符号切换字体，则需要直接调用数学字体宏包（见 \ref{subsec:font-pkgs} 小节）。在 \texttt{xelatex} 或者 \texttt{lualatex} 编译命令下，还可以使用基于 \pkg{fontspec} 宏包的 \pkg{unicode-math} 宏包配置 Unicode 数学字体，详见 \ref{subsec:unicode-math} 小节。

\subsection{加粗的数学符号}\label{subsec:math-bold}

\cmdindex[amsmath]{boldsymbol}
表 \ref{tbl:math-fonts} 中的 \cmd{mathbf} 命令只能获得直立、加粗的字母。如果想得到粗斜体%
\footnote{国内使用粗斜体符号表示矢量，见 GB 3102.11---93。}，可以使用 \pkg{amsmath} 宏包提供的
\amscmd{boldsymbol} 命令：
\begin{example}
$\mu, M \qquad
\boldsymbol{\mu}, \boldsymbol{M}$
\end{example}

\pkgindex{bm}
\cmdindex[bm]{bm}
也可以使用 \pkg{bm} 宏包提供的 \cmd{bm} 命令：
\begin{example}
% \usepackage{bm}
$\mu, M \qquad \bm{\mu}, \bm{M}$
\end{example}
在 \LaTeX{} 默认的数学字体中，一些符号本身并没有粗体版本，使用 \amscmd{boldsymbol} 也得不到粗体。
此时 \cmd{bm} 命令会生成“伪粗体”，尽管效果比较粗糙，但在某些时候也不失为一种解决方案。

\subsection{数学符号的尺寸}\label{subsec:math-styles}

\mathindex{displaystyle,textstyle,scriptstyle,scriptscriptstyle}
数学符号按照符号排版的位置规定尺寸，从大到小包括行间公式尺寸、行内公式尺寸、上下标尺寸、次级上下标尺寸。
除了字号有别之外，行间和行内公式尺寸下的巨算符也使用不一样的大小。\LaTeX{} 为每个数学尺寸指定了一个切换的命令，见 \ref{tbl:math-size}。
\begin{table}[htp]
\centering
\caption{数学符号尺寸}\label{tbl:math-size}
\begin{tabular}{lll}
 \hline
 \textbf{命令} & \textbf{尺寸} & \textbf{示例} \\
 \hline
\cmd{displaystyle}      & 行间公式尺寸   & $\displaystyle\sum a $\\
\cmd{textstyle}         & 行内公式尺寸   & $\textstyle\sum a $ \\
\cmd{scriptstyle}       & 上下标尺寸     & $\scriptstyle a$ \\
\cmd{scriptscriptstyle} & 次级上下标尺寸 & $\scriptscriptstyle a$\\
 \hline
\end{tabular}
\end{table}

我们通过以下示例对比行间公式和行内公式的区别。在分式中，分子分母默认为行内公式尺寸，示例中将分母切换到行间公式尺寸：
\begin{example}
\[
r = \frac
  {\sum_{i=1}^n (x_i- x)(y_i- y)}
  {\displaystyle \left[
    \sum_{i=1}^n (x_i-x)^2
    \sum_{i=1}^n (y_i-y)^2
  \right]^{1/2} }
\]
\end{example}

\section{定理环境}\label{sec:theorems}

\subsection{\LaTeX{} 原始的定理环境}\label{subsec:latex-theorems}

\cmdindex{newtheorem}
使用 \LaTeX{} 排版数学和其他科技文档时，会接触到大量的定理、证明等内容。
\LaTeX{} 提供了一个基本的命令 \cmd{newtheorem} 提供定理环境的定义：
\begin{command}
\cmd{newtheorem}\marg{theorem environment}\marg{title}\oarg{section-level} \\
\cmd{newtheorem}\marg{theorem environment}\oarg{counter}\marg{title}
\end{command}

\Arg{theorem environment} 为定理环境的名称。原始的\LaTeX{} 里\textbf{没有现成的定理环境}，
不加定义而直接使用很可能会出错。\Arg{title} 是定理环境的标题（“定理”，“公理”等）。

定理的序号由两个可选参数之一决定，它们\textbf{不能同时使用}：
\begin{itemize}
  \item \Arg{section level} 为章节级别，如 \texttt{chapter}、\texttt{section} 等，定理序号成为章节的下一级序号；
  \item \Arg{counter} 为用 \cmd{newcounter} 自定义的计数器名称（详见 \ref{sec:counters} 节），定理序号由这个计数器管理。
\end{itemize}
如果两个可选参数都不用的话，则使用默认的与定理环境同名的计数器。

在以下示例代码中，我们定义了一个 \env{mythm} 环境，其序号设为 \texttt{section} 的下一级序号。
注意 \env{mythm} 环境的可选参数以及 \cmd{label} 的用法：
\begin{example}
\newtheorem{mythm}{My Theorem}[section]
\begin{mythm}\label{thm:light}
The light speed in vacuum
is $299,792,458\,\mathrm{m/s}$.
\end{mythm}
\begin{mythm}[Energy-momentum relation]
The relationship of energy,
momentum and mass is
\[E^2 = m_0^2 c^4 + p^2 c^2\]
where $c$ is the light speed
described in theorem \ref{thm:light}.
\end{mythm}
\end{example}

\subsection{\pkg{amsthm} 宏包}\label{subsec:amsthm}

\LaTeX{} 默认的定理环境格式为粗体标签、斜体正文、定理名用小括号包裹。如果需要修改格式，
则要依赖其它的宏包，如 \pkg{amsthm}、\pkg{ntheorem} 等等。本小节简单介绍一下 \pkg{amsthm} 的用法。

\pkgindex{amsthm}
\cmdindex[amsthm]{theoremstyle}
\pkg{amsthm} 提供了 \cmd{theo\-rem\-style} 命令支持定理格式的切换，
在用 \cmd{new\-theo\-rem} 命令定义定理环境之前使用。
\pkg{amsthm} 预定义了三种格式用于 \cmd{theo\-rem\-style}：\texttt{plain} 和 \LaTeX{} 原始的格式一致；
\texttt{defi\-ni\-tion} 使用粗体标签、正体内容；\texttt{remark} 使用斜体标签、正体内容。

另外 \pkg{amsthm} 还支持用带星号的 \cmd{new\-theo\-rem*} 定义不带序号的定理环境：
\begin{verbatim}
\theoremstyle{definition} \newtheorem{law}{Law}
\theoremstyle{plain} \newtheorem{jury}[law]{Jury}
\theoremstyle{remark} \newtheorem*{mar}{Margaret}
\end{verbatim}
\theoremstyle{definition} \newtheorem{law}{Law}
\theoremstyle{plain} \newtheorem{jury}[law]{Jury}
\theoremstyle{remark} \newtheorem*{mar}{Margaret}

以上例子定义的 \env{jury} 环境与 \env{law} 环境共用编号，\env{mar} 环境不编号：
\begin{example}
\begin{law}\label{law:box}
Don't hide in the witness box.
\end{law}
\begin{jury}[The Twelve]
It could be you! So beware and
see law~\ref{law:box}.\end{jury}
\begin{jury}
You will disregard the last
statement.\end{jury}
\begin{mar}No, No, No\end{mar}
\begin{mar}Denis!\end{mar}
\end{example}

\pkg{amsthm} 还支持使用 \cmd{new\-theorem\-style} 命令自定义定理格式，
更为方便使用的是 \pkg{ntheorem} 宏包。感兴趣的读者可参阅它们的帮助文档。

\subsection{证明环境和证毕符号}\label{subsec:proof}

\envindex[amsthm]{proof}
\pkg{amsthm} 还提供了一个 \env{proof} 环境用于排版定理的证明过程。\env{proof} 环境末尾
自动加上一个 \qedsymbol{} 证毕符号：
\begin{example}
\begin{proof}
For simplicity, we use
\[
E=mc^2
\]
That's it.
\end{proof}
\end{example}

\cmdindex[amsthm]{qedhere}
如果行末是一个不带编号的公式，\qedsymbol{} 符号会另起一行，
这时可使用 \cmd{qedhere} 命令将 \qedsymbol{} 符号放在公式末尾：
\begin{example}
\begin{proof}
For simplicity, we use
\[
E=mc^2 \qedhere
\]
\end{proof}
\end{example}

\cmd{qedhere} 对于 \amsenv{align*} 等环境也有效：
\begin{example}
\begin{proof}
Assuming $\gamma
= 1/\sqrt{1-v^2/c^2}$, then
\begin{align*}
E &= \gamma m_0 c^2  \\
p &= \gamma m_0v \qedhere
\end{align*}
\end{proof}
\end{example}

在使用带编号的公式时，建议最好\textbf{不要在公式末尾使用} \cmd{qedhere} 命令。
对带编号的公式使用 \cmd{qedhere} 命令会使 \qedsymbol{} 符号放在一个难看的位置，紧贴着公式：
\begin{example}
\begin{proof}
For simplicity, we use
\begin{equation}
E=mc^2.\qedhere
\end{equation}
\end{proof}
\end{example}

在 \amsenv{align} 等环境中使用 \cmd{qedhere} 命令会使 \qedsymbol{} 盖掉公式的编号；使用 \env{equation} 嵌套
\amsenv{aligned} 等环境时，\cmd{qedhere} 命令会将 \qedsymbol{} 直接放在公式后。这些位置都不太正常。

证毕符号 \qedsymbol{} 本身被定义在命令 \cmd{qedsymbol} 中，如果有使用实心符号作为证毕符号的需求，需要自行用 \cmd{re\-new\-comm\-and}
命令修改（用法见 \ref{subsec:newcmd} 小节）\footnote{注意，这个改法\textbf{只对 \pkg{amsthm} 宏包适用}。
其它宏包如 \pkg{ntheorem} 等须参考帮助文档里提供的修改方法。}。
我们可以利用在 \ref{subsec:rules} 小节介绍的标尺盒子来生成一个适当大小的“实心矩形”：
\begin{example}
\renewcommand{\qedsymbol}%
  {\rule{1ex}{1.5ex}}
\begin{proof}
For simplicity, we use
\[
E=mc^2 \qedhere
\]
\end{proof}
\end{example}

\endinput
